package tmp;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 交易信息，按照《中国银联在线支付平台-收单机构接入接口规范 _v1.1》第7部分，数据元说明定义。
 * 
 * @author 涛
 * 
 */
public class TranInfo implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 版本号 值为{@value} NS5 固定填写3.0.0
	 */
	public static final String version = "version";
	/**
	 * 证书ID 值为{@value} N1..128 填写RSA证书的Serial Number
	 */
	public static final String certId = "certId";
	/**
	 * 签名 值为{@value} ANS1..256 填写对报文摘要的签名
	 */
	public static final String signature = "signature";
	/**
	 * 编码方式 值为{@value} encoding ANS1..20 填写报文使用的字符编码，若不填写，默认取值：UTF-8
	 */
	public static final String encoding = "encoding";
	/**
	 * 交易类型 值为{@value} N2 取值： 01：消费 02：预授权 03：预授权完成 04：退货 11：代收 12：代付 13：账单支付
	 * 31：消费撤销 32：预授权撤销 33：预授权完成撤销 71：余额查询 72：实名认证-建立绑定关系 73：账单查询 74：解除绑定关系
	 * 75：查询绑定关系 76：文件传输 77：发送短信验证码交易 78：银联在线支付开通查询交易
	 */
	public static final String txnType = "txnType";
	/**
	 * 交易子类 值为{@value} N2 依据实际交易类型填写 默认取值：00
	 */
	public static final String txnSubType = "txnSubType";
	/**
	 * 业务类型 值为{@value} N6 依据实际业务场景填写 默认取值:000000 具体取值范围： 000101 基金业务之股票基金 000102 基金业务之货币基金
	 */
	public static final String bizType = "bizType";
	/**
	 * 前台通知地址 值为{@value} ANS1..256 前台返回商户结果时使用，前台类交易需上送
	 */
	public static final String frontUrl = "frontUrl";
	/**
	 * 后台通知地址 值为{@value} ANS1..256 后台返回商户结果时使用，如上送，则发送商户后台交易结果通知
	 */
	public static final String backUrl = "backUrl";
	/**
	 * 接入类型 值为{@value} N1 0：商户直连接入 1：收单机构接入
	 */
	public static final String accessType = "accessType";
	/**
	 * 收单机构代码 值为{@value} AN11 已被批准加入银联互联网系统的收单机构代码
	 */
	public static final String acqInsCode = "acqInsCode";
	/**
	 * 商户类别 值为{@value} N4 填写MCC码，接入类型为收单机构接入时需上送
	 */
	public static final String merCatCode = "merCatCode";
	/**
	 * 商户类型 值为{@value} N1 0：普通商户 1：平台类商户
	 */
	public static final String merType = "merType";
	/**
	 * 商户代码 值为{@value} ANS15 已被批准加入银联互联网系统的商户代码
	 */
	public static final String merId = "merId";
	/**
	 * 商户名称 值为{@value} ANS1..40 接入类型为收单机构接入时需上送
	 */
	public static final String merName = "merName";
	/**
	 * 商户简称 值为{@value} ANS1..16 接入类型为收单机构接入时需上送
	 */
	public static final String merAbbr = "merAbbr";
	/**
	 * 二级商户代码 值为{@value} ANS5..15 商户类型为平台类商户接入时必须上送
	 */
	public static final String subMerId = "subMerId";
	/**
	 * 二级商户名称 值为{@value} ANS1..40 商户类型为平台类商户接入时必须上送
	 */
	public static final String subMerName = "subMerName";
	/**
	 * 二级商户简称 值为{@value} ANS1..16 商户类型为平台类商户接入时必须上送
	 */
	public static final String subMerAbbr = "subMerAbbr";
	/**
	 * 商户订单号 值为{@value} ANS8..32 商户订单号，支持“-”及“_”
	 */
	public static final String orderId = "orderId";
	/**
	 * 订单发送时间 值为{@value} YYYYMMDDhhmmss 商户发送交易时间
	 */
	public static final String txnTime = "txnTime";
	/**
	 * 订单超时时间间隔 值为{@value} N1..10
	 * 单位为毫秒，交易发生时，该笔交易在银联互联网系统中有效的最长时间。当距离交易发送时间超过该时间时，银联互联网系统不再为该笔交易提供支付服务?
	 */
	public static final String orderTimeoutInterval = "orderTimeoutInterval";
	/**
	 * 支付超时时间 值为{@value} YYYYMMDDhhmmss
	 * 订单支付超时时间，超过此时间用户支付成功的交易，不通知商户，系统自动退款，大约5个工作日金额返还到用户账户
	 */
	public static final String payTimeoutTime = "payTimeoutTime";
	/**
	 * 默认支付方式 值为{@value} N4 取值如下： 0001：认证支付 0002：快捷支付 0003：小额支付 0004：储值卡支付
	 * 0005：IC卡支付 0006：实名支付 0201：网银支付 1001：牡丹畅通卡支付 1002：中铁银通卡支付 0401：信用卡支付 —— 暂定
	 * 0402：小额临时支付 0403：认证支付2.0 0404：互联网订单手机支付 9000：其他无卡支付(如手机客户端支付)
	 * 
	 * 以下取值不对商户公开，内部暂时使用支付方式域记录 0101：账户绑定验证 0102：银联认证支付开通验证 0103：小额支付开通验证
	 * 0104：认证支付2.0开通验证 0301：后台支付
	 */
	public static final String defaultPayType = "defaultPayType";
	/**
	 * 支持支付方式 值为{@value} AN1..128 由收单机构填写，取值为以下内容的一种或多种，通过逗号（，）分割。 0001：认证支付 0002：快捷支付
	 * 0003：小额支付 0004：储值卡支付 0005：IC卡支付 0006：实名支付 0201：网银支付 1001：牡丹畅通卡支付
	 * 1002：中铁银通卡支付 0401：信用卡支付 —— 暂定 0402：小额临时支付 0403：认证支付2.0 0404：互联网订单手机支付
	 * 9000：其他无卡支付(如手机客户端支付)
	 * 
	 * 以下取值不对商户公开，内部暂时使用支付方式域记录 0101：账户绑定验证 0102：银联认证支付开通验证 0103：小额支付开通验证
	 * 0104：认证支付2.0开通验证 0301：后台支付
	 */
	public static final String supPayType = "supPayType";
	/**
	 * 支付方式 值为{@value} N4 默认不返回此域，如需要返此域，需要提交申请，视商户配置返回，可在消费类交易中返回以下中的一种： 0001：认证支付
	 * 0002：快捷支付 0003：小额支付 0004：储值卡支付 0005：IC卡支付 0006：实名支付 0201：网银支付
	 * 1001：牡丹畅通卡支付 1002：中铁银通卡支付 0401：信用卡支付 —— 暂定 0402：小额临时支付 0403：认证支付2.0
	 * 0404：互联网订单手机支付 9000：其他无卡支付(如手机客户端支付)
	 * 
	 * 以下取值不对商户公开，内部暂时使用支付方式域记录 0101：账户绑定验证 0102：银联认证支付开通验证 0103：小额支付开通验证
	 * 0104：认证支付2.0开通验证 0301：后台支付
	 */
	public static final String payType = "payType";
	/**
	 * 自定义支付方式 值为{@value} N4 特殊商户使用，可能的值为以下中的一种： 1001：牡丹畅通卡支付 1002：中铁银通卡支付
	 */
	public static final String customPayType = "customPayType";
	/**
	 * 物流标识 值为{@value} N2 01：有物流
	 * 02：无物流，高风险，收益人不可追溯；此类商品包括：游戏点卡、游戏装备、游戏道具；虚拟货币；账号买卖；手机充值卡；彩票
	 * ；礼品卡；购物券；商户虚拟账户充值等 03：无物流，可风险，收益人可追溯；此类商品为除“第二类”列举外的商品
	 * 04：无物流，其他；对于商户无法区分当前交易风险时请按此标识上送
	 */
	public static final String shippingFlag = "shippingFlag";
	/**
	 * 收货地址-国家 值为{@value} AN6 物流标识为01时需上送
	 */
	public static final String shippingCountryCode = "shippingCountryCode";
	/**
	 * 收货地址-省 值为{@value} AN6 物流标识为01时需上送
	 */
	public static final String shippingProvinceCode = "shippingProvinceCode";
	/**
	 * 收货地址-市 值为{@value} AN6 物流标识为01时需上送
	 */
	public static final String shippingCityCode = "shippingCityCode";
	/**
	 * 收货地址-地区 值为{@value} AN6 物流标识为01时需上送
	 */
	public static final String shippingDistrictCode = "shippingDistrictCode";
	/**
	 * 收货地址-详细 值为{@value} ANS1..256 物流标识为01时需上送
	 */
	public static final String shippingStreet = "shippingStreet";
	/**
	 * 商品种类 值为{@value} N4 区分商品类别
	 */
	public static final String commodityCategory = "commodityCategory";
	/**
	 * 商品名称 值为{@value} ANS1..256 物流标识为01时需上送
	 */
	public static final String commodityName = "commodityName";
	/**
	 * 商品URL 值为{@value} ANS1..1024 物流标识为01时需上送
	 */
	public static final String commodityUrl = "commodityUrl";
	/**
	 * 商品单价 值为{@value} N1..12 物流标识为01时需上送
	 */
	public static final String commodityUnitPrice = "commodityUnitPrice";
	/**
	 * 商品数量 值为{@value} N1..10 物流标识为01时需上送
	 */
	public static final String commodityQty = "commodityQty";
	/**
	 * 预授权号 值为{@value} N6 预授权交易时返回
	 */
	public static final String preAuthId = "preAuthId";
	/**
	 * 交易币种 值为{@value} AN3 默认取值：156
	 */
	public static final String currencyCode = "currencyCode";
	/**
	 * 帐户类型 值为{@value} N2 01:银行卡 02:存折 默认取值：01
	 */
	public static final String accType = "accType";
	/**
	 * 帐号 值为{@value} AN1..60 交易帐号
	 */
	public static final String accNo = "accNo";
	/**
	 * 支付卡类型 值为{@value} N2 消费交易，视商户配置返回。该域取值为： 00：未知 01：借记账户 02：贷记账户 03：准贷记账户 04：借贷合一账户
	 * 05：预付费账户 06：半开放预付费账户
	 */
	public static final String payCardType = "payCardType";
	/**
	 * 发卡机构代码 值为{@value} AN1..20 当帐户类型为02-存折时需填写 在前台类交易时填写默认银行代码，支持直接跳转到网银
	 */
	public static final String issInsCode = "issInsCode";
	/**
	 * 开户行省 值为{@value} ANS1..30 代付交易时可选上传
	 */
	public static final String issInsProvince = "issInsProvince";
	/**
	 * 开户行市 值为{@value} ANS1..30 代付交易时可选上传
	 */
	public static final String issInsCity = "issInsCity";
	/**
	 * 持卡人信息 值为{@value} VAR1 填写对以下内容做Base64后的密文： {证件类型|证件号码|姓名|手机号|短信验证码|持卡人密码|CVN2|有效期}
	 * 当子域不出现时，可为空，并保留|分割。各字段取值为： 1、证件类型：N2 01：身份证 02：军官证 03：护照 04：回乡证 05：台胞证
	 * 06：警官证 07：士兵证 99：其它证件 2、证件号码：ANS1..20 3、姓名：ANS1..32，支持汉字 4、手机号：N1..20
	 * 5、短信验证码：N6 6、持卡人密码：ANS1..256，使用RSA证书对 ANSI X9.8格式的PIN加密，并Base64 7、CVN2：N3
	 * 8、有效期：YYMM
	 */
	public static final String issInsName = "issInsName";
	/**
	 * 交易金额 值为{@value} N1..12 单位为分
	 */
	public static final String customerInfo = "customerInfo";
	/**
	 * 余额 值为{@value} AN1..49 用法一：用于银行卡、银行帐户余额查询中返回帐户实际余额和可用余额。
	 * 用法二：用于费用查询、自助缴费交易中，用于表示用户在SP用户的帐户实际余额和可用余额。
	 * 用法三：在查询信用卡帐户余额的交易中返回帐户的应还金额和最低还款额。 最多可携带2个如下所示的余额信息：
	 * 帐户类型|余额类型|货币代码|余额符号|余额 当子域不出现时，可为空，并保留|分割。各字段取值为： 1、帐户类型：N2 00－缺省帐户
	 * 10－储蓄帐户（只适用于银行帐户） 30－信用卡帐户（只适用于银行帐户） 2、余额类型：N2 01－帐面余额（银行帐户）
	 * 02－可用余额（银行帐户） 11－信用卡帐户应还金额 12－信用卡帐户最低还款额 16－帐面余额（SP用户帐户） 17－可用余额（SP用户帐户）
	 * 3、货币代码：AN3，默认156 4、余额符号：AN1 欠费状态：D 非欠费状态：C 5、余额：N1..12，以分为单位
	 * 余额符号为D时，本域表示欠费金额 余额符号为C时，本域表示实际余额
	 */
	public static final String txnAmt = "txnAmt";
	/**
	 * 地区代码 值为{@value} N4 账单查询/支付类交易中填写地区代码，账单查询/支付类交易中除信用卡还款外需上送
	 */
	public static final String balance = "balance";
	/**
	 * 附加地区代码 值为{@value} N4 账单查询/支付类交易中填写附加地区代码
	 */
	public static final String districtCode = "districtCode";
	/**
	 * 账单类型 值为{@value} N4 前2位取值： 01：移动电话（用作支付式时，表示动电话支付） 02：固定电话（用作支付方式时，表示固定电话付） 03：水费
	 * 04：电费 05：煤气费 06：社保 07：小灵通 08：信用卡还款 09：烟草 10：信用卡中心 11：有线和付费电视 12：保险 13：税务
	 * 14：证券公司 15：金融机构 16：贷款还款 CS：财税库银 RZ：商户实时入账 OT：其他 后2位默认取值为：00
	 */
	public static final String additionalDistrictCode = "additionalDistrictCode";
	/**
	 * 账单号码 值为{@value} AN1..64 账单查询/支付类交易中填写具体账单号码 用法一：账单查询/支付类交易中网上缴税用法，填写纳税人编码
	 * 用法二：账单查询/支付类交易中信用卡还款用法，填写信用卡卡号
	 */
	public static final String billType = "billType";
	/**
	 * 账单号码 值为{@value} billNo AN1..64 账单查询/支付类交易中填写具体账单号码 用法一：账单查询/支付类交易中网上缴税用法，填写纳税人编码
	 * 用法二：账单查询/支付类交易中信用卡还款用法，填写信用卡卡号
	 */
	public static final String billNo = "billNo";
	/**
	 * 账单月份 值为{@value} YYYYMM
	 */
	public static final String billMonth = "billMonth";
	/**
	 * 账单查询要素 值为{@value} ANS1..1024 账单查询/支付类交易中用于上送其他未定义的账单要素 用法
	 * 一：账单查询/支付类交易中网上缴税用法，填写征收机关代码、外部申报电子序号、缴款单位名称
	 */
	public static final String billQueryInfo = "billQueryInfo";
	/**
	 * 账单详情 值为{@value} ANS1..1024 账单查询/支付类交易中填写查询到的账单详细信息
	 */
	public static final String billDetailInfo = "billDetailInfo";
	/**
	 * 账单金额 值为{@value} N1..12 用于返回账单金额余额符号为D时，本域表示欠费金额余额符号为C时，本域表示实际余额
	 */
	public static final String billAmt = "billAmt";
	/**
	 * 账单金额符号 值为{@value} A1 D：欠费状态 C：非欠费状态
	 */
	public static final String billAmtSign = "billAmtSign";
	/**
	 * 绑定标识号 值为{@value} ANS1..128 用于唯一标识绑定关系
	 */
	public static final String bindId = "bindId";
	/**
	 * 风险级别 值为{@value} N1 绑定支付交易时使用： 0：无风险业务 1：有风险业务
	 */
	public static final String riskLevel = "riskLevel";
	/**
	 * 绑定信息 值为{@value} ANS1..128
	 */
	public static final String bindInfo = "bindInfo";
	/**
	 * 绑定信息条数 值为{@value} N1..2 查询绑定关系时，返回的绑定信息条数
	 */
	public static final String bindInfoQty = "bindInfoQty";
	/**
	 * 绑定信息集 值为{@value} VAR1..99 查询绑定关系时，返回的具体绑定信息集，格式为： {绑定标识号|风险级别|帐号|绑定信息|持卡人信息}
	 * 多条绑定信息之间使用，分割
	 */
	public static final String bindInfoList = "bindInfoList";
	/**
	 * 批次号 值为{@value} N4 批量交易时填写，当天唯一,0001-9999，商户号+批次号+上交易时间确定一笔交易
	 */
	public static final String batchNo = "batchNo";
	/**
	 * 总笔数 值为{@value} N1..4 批量交易时填写，填写批量中，总的交易比数
	 */
	public static final String totalQty = "totalQty";
	/**
	 * 总金额 值为{@value} N1..12 批量交易时填写，填写批量中，总的交易金额
	 */
	public static final String totalAmt = "totalAmt";
	/**
	 * 文件类型 值为{@value} N2 依据实际业务情况定义，默认值为：00
	 */
	public static final String fileType = "fileType";
	/**
	 * 文件名 值为{@value} ANS1..64 填写文件名称
	 */
	public static final String fileName = "fileName";
	/**
	 * 批量文件内容 值为{@value} ???? 压缩，Base64编码后的文件内容
	 */
	public static final String fileContent = "fileContent";
	/**
	 * 商户摘要 值为{@value} ANS1..64 填写显示在持卡人账户中的交易摘要/备注
	 */
	public static final String merNote = "merNote";
	/**
	 * 商户自定义域 值为{@value} ANS1..1024
	 */
	public static final String acqReserved = "acqReserved";
	/**
	 * 保留域 值为{@value} ANS1..1024
	 */
	public static final String reserved = "reserved";
	/**
	 * 终端号 值为{@value} ANS1..64 填写发起交易的终端地址
	 */
	public static final String termId = "termId";
	/**
	 * 终端类型 值为{@value} N2 00：未知 03：有线销售点终端（POS） 05：多媒体终端 07：个人电脑 08：手机设备
	 * 10：基于PBOC电子钱包/存折标准的交易终端 11：无线销售点终端（移动POS） 14：商户系统 15：第三方机构系统（目前主要是渠道接入机构）
	 * 16：数字机顶盒
	 */
	public static final String termType = "termType";
	/**
	 * 交互方式 值为{@value} N1 0：缺省值 1：互联网 2：短信 3：语音
	 */
	public static final String interactMode = "interactMode";
	/**
	 * 发卡机构识别模式 值为{@value} N1 0：发卡机构自主识别模式 1：发卡机构辅助识别模式
	 */
	public static final String recognitionMode = "recognitionMode";
	/**
	 * 商户端用户号 值为{@value} ANS1..64
	 */
	public static final String merUserId = "merUserId";
	/**
	 * 持卡人IP 值为{@value} NS7..40 填写持卡人发起交易的IP地址，用于防钓鱼
	 */
	public static final String customerIp = "customerIp";
	/**
	 * 查询流水号 值为{@value} AN21 由银联返回，用于在后续类交易中唯一标识一笔交易
	 */
	public static final String queryId = "queryId";
	/**
	 * 原交易查询流水号 值为{@value} AN21
	 */
	public static final String origQryId = "origQryId";
	/**
	 * 系统跟踪号 值为{@value} N6
	 */
	public static final String traceNo = "traceNo";
	/**
	 * 交易传输时间 值为{@value} YYYYMMDDhhmmss
	 */
	public static final String traceTime = "traceTime";
	/**
	 * 清算日期 值为{@value} YYYYMMDD
	 */
	public static final String settleDate = "settleDate";
	/**
	 * 清算币种 值为{@value} AN3
	 */
	public static final String settleCurrencyCode = "settleCurrencyCode";
	/**
	 * 清算金额 值为{@value} N1..12
	 */
	public static final String settleAmt = "settleAmt";
	/**
	 * 清算汇率 值为{@value} N8 境外交易时返回。 格式为右对齐，无小数点。小数位数由最左边一位数字表示，第二位至第八位指的是汇率的值
	 */
	public static final String exchangeRate = "exchangeRate";
	/**
	 * 兑换日期 值为{@value} YYYYMMDD 境外交易时返回。
	 */
	public static final String exchangeDate = "exchangeDate";
	/**
	 * 响应时间 值为{@value} YYYYMMDDhhmmss
	 */
	public static final String respTime = "respTime";
	/**
	 * 原交易应答码 值为{@value} AN2
	 */
	public static final String origRespCode = "origRespCode";
	/**
	 * 原交易应答信息 值为{@value} ANS1..256
	 */
	public static final String origRespMsg = "origRespMsg";
	/**
	 * 应答码 值为{@value} AN2 具体参见应答码定义章节
	 */
	public static final String respCode = "respCode";
	/**
	 * 应答信息 值为{@value} ANS1..256 填写具体的应答信息
	 */
	public static final String respMsg = "respMsg";
	/**
	 * 商户端用户注册时间 值为{@value} YYYYMMDD
	 */
	public static final String merUserRegDt = "merUserRegDt";
	/**
	 * 商户端用户注册邮箱 值为{@value} ANS1..256
	 */
	public static final String merUserEmail = "merUserEmail";
	/**
	 * 发送机构代码 值为{@value} AN11
	 */
	public static final String sndInsCode = "sndInsCode";
	/**
	 * 验证标识 值为{@value} N6 表示交易时对持卡人的验证要素要求
	 * 共6位长，每位以0、1表示是否需要，0代表不需要，1代表需要；每位代表的顺序如下； 证件类型 证件号后8位 动态密码 CVN2 有效期 账户密码
	 */
	public static final String checkFlag = "checkFlag";
	/**
	 * 开通状态 值为{@value} N1 0 – 未开通业务 1 –已开通银联在线支付
	 */
	public static final String activateStatus = "activateStatus";

	private Map<String, String> tranInfoMap = new HashMap<String, String>();

	/**
	 * 获取交易信息字典，以Key（String），Value（String）形式存储交易信息
	 * 
	 * @return 交易信息字典
	 */
	public Map<String, String> getTranInfoMap() {
		return tranInfoMap;
	}

	/**
	 * 直接获取交易字典中的值
	 * 
	 * @param key
	 *            键，该键值为TranInfo中的常量值
	 * @return 值，如果对应的值不存在或为空，则返回null
	 */
	public String getValueBy(String key) {
		if (tranInfoMap.containsKey(key)) {
			return tranInfoMap.get(key);
		}

		return null;
	}
}
